from rdkit import Chem


def check_molecular_validity(smiles_list):
    """S
    检查分子的有效性。
    :param smiles_list: 包含 SMILES 字符串的列表。
    :return: (有效分子数, 总分子数, 有效率)
    """
    valid_count = 0
    total_count = len(smiles_list)

    for smiles in smiles_list:
        mol = Chem.MolFromSmiles(smiles)
        if mol is not None and len(smiles)<=50:  # 如果能成功解析成 RDKit 分子对象，则认为是有效分子
            valid_count += 1

    validity_rate = valid_count / total_count if total_count > 0 else 0
    return valid_count, total_count, validity_rate


if __name__ == "__main__":
    # 读取生成的分子文件
    input_file_path = "./molecules.txt"
    with open(input_file_path, "r") as f:
        smiles_list = [line.strip() for line in f.readlines()]  # 每行是一个 SMILES，去掉空白符

    # 检查有效性
    valid_count, total_count, validity_rate = check_molecular_validity(smiles_list)
    print(f"总分子数：{total_count}")
    print(f"有效分子数：{valid_count}")
    print(f"有效率：{validity_rate:.2%}")
